function getCacheData<T>(key: string): T {
    return (window as any).cache[key]
}

interface Cat {
    name: string;

    run(): void;
}

const tom = getCacheData<Cat>('tom')
tom.run()


// 交换元组中的两个值的位置
function swap<T, U>(tuple: [T, U]): [U, T] {
    return [tuple[1], tuple[0]]
}

swap([8, 'eight']) // ['eight',8]


// 泛型约束
// 定义一个接口，作为约束条件
// T extends Item ,即 T 在未来对应具体的类型后，必须要有Item中的属性和方法
interface Lengthwise {
    length: number

}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length)
    return arg

}

// loggingIdentity(1)


// 泛型接口
interface CreateArrayFunc {
    <T>(length: number, value: T): Array<T>
}

let createArray: CreateArrayFunc;
// 可以指定泛型默认值
createArray = function <T = string>(length: number, value: T): Array<T> {
    let result: T[] = []
    for (let i = 0; i < length; i++) {
        result[i] = value
    }
    return result
}
// 类型推断
createArray(3, 'x')
